/**
 * 灯光模式管理服务
 * 用于管理灯光模式的状态和切换
 */

const storageService = require('../services/storage')

// 灯光模式类型常量
const LIGHT_MODE_TYPES = {
  // 自动模式
  AUTO: 'auto',
  // 手动模式
  MANUAL: 'manual',
}

// 当前灯光模式常量
const CURRENT_LIGHT_MODES = {
  // 手动快捷模式
  MANUAL_SHORTCUT: 'manual_shortcut',
  // 手动玩家模式
  MANUAL_PLAYER: 'manual_player',
}

// 存储键名
const STORAGE_KEYS = {
  // 当前灯光模式（手动快捷模式/手动玩家模式）
  CURRENT_LIGHT_MODE: 'currentLightMode',
}

/**
 * 获取存储键名
 * @param {string} keyType - 存储键类型
 * @param {string} id - 设备ID或编组ID
 * @param {boolean} isGroup - 是否为编组
 * @returns {string} 完整的存储键名
 */
function getStorageKey(keyType, id, isGroup = false) {
  // 确保id是有效的
  if (!id) {
    console.error('getStorageKey: 无效的ID', id)
    id = 'unknown'
  }

  // 检查id是否已经包含group_前缀，避免重复添加
  const hasGroupPrefix = typeof id === 'string' && id.startsWith('group_')

  // 构建带有设备/编组ID的键名
  // 如果是编组且ID没有group_前缀，则添加前缀
  const prefix = isGroup && !hasGroupPrefix ? `group_${id}` : id

  // 记录生成的键名，帮助调试
  const key = `${keyType}_${prefix}`
  console.log(`生成存储键名: ${key}, 原始ID: ${id}, 是否编组: ${isGroup}`)

  return key
}

/**
 * 获取当前灯光模式
 * @param {string} id - 设备ID或编组ID
 * @param {boolean} isGroup - 是否为编组
 * @param {string} deviceType - 设备类型
 * @returns {string} 当前灯光模式，默认为手动快捷模式
 */
function getCurrentLightMode(id, isGroup = false, deviceType) {
  const key = getStorageKey(STORAGE_KEYS.CURRENT_LIGHT_MODE, id, isGroup)
  return wx.getStorageSync(key) || CURRENT_LIGHT_MODES.MANUAL_SHORTCUT // 默认为手动快捷模式
}

/**
 * 保存当前灯光模式
 * @param {string} id - 设备ID或编组ID
 * @param {string} mode - 当前灯光模式
 * @param {boolean} isGroup - 是否为编组
 * @param {string} deviceType - 设备类型
 */
function saveCurrentLightMode(id, mode, isGroup = false, deviceType) {
  const key = getStorageKey(STORAGE_KEYS.CURRENT_LIGHT_MODE, id, isGroup)
  wx.setStorageSync(key, mode)
}

/**
 * 检查是否为手动模式
 * @param {string} id - 设备ID或编组ID
 * @param {boolean} isGroup - 是否为编组
 * @param {string} deviceType - 设备类型
 * @returns {boolean} 是否为手动模式
 */
function isManualMode(id, isGroup = false, deviceType) {
  return storageService.getLightModeState(id) === LIGHT_MODE_TYPES.MANUAL
}

/**
 * 检查是否为自动模式
 * @param {string} id - 设备ID或编组ID
 * @param {boolean} isGroup - 是否为编组
 * @param {string} deviceType - 设备类型
 * @returns {boolean} 是否为自动模式
 */
function isAutoMode(id, isGroup = false, deviceType) {
  return storageService.getLightModeState(id) === LIGHT_MODE_TYPES.AUTO
}

/**
 * 从设备或编组获取deviceType
 * @param {string} id - 设备ID或编组ID
 * @param {boolean} isGroup - 是否为编组
 * @returns {string} 设备类型，如果找不到则返回默认值
 */
function getDeviceTypeFromEntity(id, isGroup) {
  try {
    if (isGroup) {
      // 从编组获取deviceType
      const groups = storageService.getGroups();
      const group = groups.find(g => g.id === id);
      return group?.deviceType || 'seawater_lamp'; // 默认设备类型
    } else {
      // 从设备获取deviceType
      const devices = storageService.getDevices();
      const device = devices.find(d => d.id === id);
      return device?.deviceType || 'seawater_lamp'; // 默认设备类型
    }
  } catch (e) {
    console.error('获取设备类型失败:', e);
    return 'seawater_lamp'; // 默认设备类型
  }
}

/**
 * 检查是否为手动快捷模式
 * @param {string} id - 设备ID或编组ID
 * @param {boolean} isGroup - 是否为编组
 * @param {string} deviceType - 设备类型
 * @returns {boolean} 是否为手动快捷模式
 */
function isManualShortcutMode(id, isGroup = false, deviceType) {
  return (
    isManualMode(id, isGroup, deviceType) &&
    getCurrentLightMode(id, isGroup, deviceType) === CURRENT_LIGHT_MODES.MANUAL_SHORTCUT
  )
}

/**
 * 检查是否为手动玩家模式
 * @param {string} id - 设备ID或编组ID
 * @param {boolean} isGroup - 是否为编组
 * @param {string} deviceType - 设备类型
 * @returns {boolean} 是否为手动玩家模式
 */
function isManualPlayerMode(id, isGroup = false, deviceType) {
  return (
    isManualMode(id, isGroup, deviceType) &&
    getCurrentLightMode(id, isGroup, deviceType) === CURRENT_LIGHT_MODES.MANUAL_PLAYER
  )
}

/**
 * 设置为手动快捷模式
 * @param {string} id - 设备ID或编组ID
 * @param {boolean} isGroup - 是否为编组
 * @param {string} deviceType - 设备类型
 */
function setManualShortcutMode(id, isGroup = false, deviceType) {
  // 确保传递deviceType参数
  if (!deviceType) {
    console.warn('setManualShortcutMode: deviceType参数缺失，尝试获取');
    deviceType = getDeviceTypeFromEntity(id, isGroup);
  }
  storageService.saveLightModeState(id, LIGHT_MODE_TYPES.MANUAL, isGroup, deviceType)
  saveCurrentLightMode(id, CURRENT_LIGHT_MODES.MANUAL_SHORTCUT, isGroup)
}

/**
 * 设置为手动玩家模式
 * @param {string} id - 设备ID或编组ID
 * @param {boolean} isGroup - 是否为编组
 * @param {string} deviceType - 设备类型
 */
function setManualPlayerMode(id, isGroup = false, deviceType) {
  // 确保传递deviceType参数
  if (!deviceType) {
    console.warn('setManualPlayerMode: deviceType参数缺失，尝试获取');
    deviceType = getDeviceTypeFromEntity(id, isGroup);
  }
  storageService.saveLightModeState(id, LIGHT_MODE_TYPES.MANUAL, isGroup, deviceType)
  saveCurrentLightMode(id, CURRENT_LIGHT_MODES.MANUAL_PLAYER, isGroup)
}

/**
 * 设置为自动模式
 * @param {string} id - 设备ID或编组ID
 * @param {boolean} isGroup - 是否为编组
 * @param {string} deviceType - 设备类型
 */
function setAutoMode(id, isGroup = false, deviceType) {
  // 确保传递deviceType参数
  if (!deviceType) {
    console.warn('setAutoMode: deviceType参数缺失，尝试获取');
    deviceType = getDeviceTypeFromEntity(id, isGroup);
  }
  storageService.saveLightModeState(id, LIGHT_MODE_TYPES.AUTO, isGroup, deviceType)
}

/**
 * 更新总开关状态（兼容旧版本）
 * @param {string} id - 设备ID或编组ID
 * @param {boolean} isGroup - 是否为编组
 * @param {boolean} state - 开关状态
 */
function updateTotalSwitchState(id, isGroup = false, state) {
  const entities = isGroup ? storageService.getGroups() : storageService.getDevices();
  const entity = entities.find(e => e.id === id);
  
  if (entity) {
    entity.totalSwitch = state;
    
    if (isGroup) {
      storageService.saveGroups(entities);
    } else {
      storageService.saveDevices(entities);
    }
  }
}

module.exports = {
  // 导出常量
  LIGHT_MODE_TYPES,
  CURRENT_LIGHT_MODES,
  STORAGE_KEYS,
  
  // 导出方法
  getStorageKey,
  getCurrentLightMode,
  saveCurrentLightMode,
  isManualMode,
  isAutoMode,
  isManualShortcutMode,
  isManualPlayerMode,
  setManualShortcutMode,
  setManualPlayerMode,
  setAutoMode,
  updateTotalSwitchState,
  getDeviceTypeFromEntity
}
